﻿using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
//MicroDesigner
using Jc.MicroDesigner.Objects;

namespace Jc.MicroDesigner.Objects
{
    /// <summary>
    /// Класс-контейнер для сбора информации на выходах устройств
    /// </summary>
    public class SignalContainer
    {
        BaseElement _Source = null;
        sbyte[] _Signals = null;
        string _Label = "";
        uint _SortIndex = 0;

        /// <summary>
        /// Создать контейнер для выходного сигнала
        /// </summary>
        /// <param name="source">Объект, генерирующий сигналы</param>
        /// <param name="capacity">Ёмкость хранилища</param>
        public SignalContainer(BaseElement source,int capacity)
        {
            _Signals = new sbyte[capacity];
            _Source = source;
            _Label = source.Name;
        }

        /// <summary>
        /// Источник сигнала
        /// </summary>
        [Browsable(false)]
        public BaseElement Source
        {
            get
            {
                return _Source;
            }
        }

        /// <summary>
        /// Массив сигналов
        /// </summary>
        [Browsable(false)]
        public sbyte[] Signals
        {
            get
            {
                return _Signals;
            }
        }

        /// <summary>
        /// Получить или изменить сигнал по его индексу в массиве
        /// </summary>
        /// <param name="index">Индекс</param>
        /// <returns>Сигнал</returns>
        [Browsable(false)]
        public sbyte this[int index]
        {
            get
            {
                return _Signals[index];
            }
            set
            {
                _Signals[index] = value;
            }
        }

        /// <summary>
        /// Ёмкость контейнера
        /// </summary>
        [Browsable(false)]
        public int Capacity
        {
            get 
            {
                if (_Signals != null)
                    return _Signals.Length;
                else
                    return -1;
            }
            set
            {
                _Signals = new sbyte[value];
            }
        }

        /// <summary>
        /// Метка для отображения на диаграмме сигналов
        /// </summary>
        [Description("Метка элемента для отображения")]
        [DisplayName("Метка")]
        [Category("Элементы")]
        public string Label
        {
            get
            {
                return _Label;
            }
            set
            {
                _Label = value;
            }
        }

        /// <summary>
        /// Индекс для учёта порядка в диаграммах сигналов
        /// </summary>
        [Description("Индекс для учёта порядка в диаграммах сигналов")]
        [DisplayName("Индекс")]
        [Category("Элементы")]
        [DefaultValue(0)]
        public uint SortIndex
        {
            get
            {
                return _SortIndex;
            }
            set
            {
                _SortIndex = value;
            }
        }

        /// <summary>
        /// Импортировать массив значений
        /// </summary>
        /// <param name="array">Массив сигналов</param>
        public void Import(sbyte[] array)
        {
            if (array != null)
            {
                _Signals = array;
            }
        }
    }
}